Evcxrを使ってJupyter Notebook(JupyterLab)でRustを実行する
EvcxrはRust用のREPLです。GitHubでOSSとして公開されています(Google Organization配下で公開されていますが、Googleのオフィシャルなプロダクトではありません)。
文字通りのREPLを提供するevcxr_replの他、Jupyter Kernel(evcxr_jupyter)もリリースされています。本ブログ記事ではこのevcxr_jupyterを使って、JupyterLab上でRustを実行する手順をご紹介します。
動作環境
今回はDockerを使って環境を構築します。
- OS : macOS Mojave v10.14.6
- Docker:Docker Desktop Community v2.1.0.3
- Rust:v1.38.0
- Evcxr:v0.4.5
- JupyterLab:v1.1.3
Dockerイメージの作成
今回はJupyterの公式Dockerイメージのminimal-notebookをベースに、RustとEvcxrを追加でインストールする形でDockerイメージを作成します。RustのインストールはRustの公式DockerイメージのDockerfileに倣います。
Dockerfile
FROM jupyter/minimal-notebook SHELL ["/bin/bash", "-o", "pipefail", "-c"] ## Install Rust USER root RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ wget \ cmake \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* ENV RUSTUP_HOME=/usr/local/rustup \ CARGO_HOME=/usr/local/cargo \ PATH=/usr/local/cargo/bin:$PATH \ RUST_VERSION=1.38.0 RUN set -eux; \ dpkgArch="$(dpkg --print-architecture)"; \ case "${dpkgArch##*-}" in \ amd64) rustArch='x86_64-unknown-linux-gnu'; rustupSha256='36285482ae5c255f2decfab27d32ba19465804cb3ddf5a23e6ff2a7b0f6e0250' ;; \ armhf) rustArch='armv7-unknown-linux-gnueabihf'; rustupSha256='cb20e54566d4b13434dea1776a961cf7f97afcc292cb4b0fec533503dd2434d0' ;; \ arm64) rustArch='aarch64-unknown-linux-gnu'; rustupSha256='58e19ae12101103ccc50b04a2579b9238163f87a27da5078cefc900098f257ab' ;; \ i386) rustArch='i686-unknown-linux-gnu'; rustupSha256='d3c42fb8b25f87eb049b6177611eea7d4fd51273de4113706f43cccf5610cfc7' ;; \ *) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \ esac; \ url="https://static.rust-lang.org/rustup/archive/1.19.0/${rustArch}/rustup-init"; \ wget "$url"; \ echo "${rustupSha256} *rustup-init" | sha256sum -c -; \ chmod +x rustup-init; \ ./rustup-init -y --no-modify-path --default-toolchain $RUST_VERSION; \ rm rustup-init; \ chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \ rustup --version; \ cargo --version; \ rustc --version; ## Install Evcxr USER 1000 RUN cargo install evcxr_jupyter && \ evcxr_jupyter --install
docker-compose.yml
Docker Composeを使って、シングルコマンドでコンテナの起動・停止ができるようにしておきます。
version: "3" services: jupyter: build: context: . dockerfile: Dockerfile image: jupyterlab environment: - TZ=Asia/Tokyo - JUPYTER_ENABLE_LAB=yes ports: - 8888:8888 volumes: - ${PWD}/work:/home/jovyan/work
JupyterLabを利用するために、環境変数にJUPYTER_ENABLE_LAB=yes
を設定します。Jupyter Notebookを利用したい場合はこの環境変数の設定を削除またはコメントアウトしてください。
Dockerイメージのビルド
docker-compose build
でDockerイメージをビルドします。手元の環境ではイメージサイズは「3.91GB」になりました。
JupyterLabの起動
docker-compose up -d
でコンテナを作成&起動します。
デフォルトで、JupyterLabのトークン認証が有効になっています。docker-compose logs
でトークンパラメータ付きのURLを確認します。
WebブラウザでJupyterLabにアクセスします。ランチャーにRustが表示されます。
Evcxrの使い方
- Hello World
セル内の最後の式の結果が出力されます。
:
がメタコマンドです。:dep
で外部モジュールを読み込めます。
:vars
で変数を参照できます。
その他、詳しい使い方はGitHub上のチュートリアルを参照ください。
まとめ
社内のRust勉強会に参加しているのですが、その中でRustのサンプルコードを動かす機会が多くあります。インタラクティブにRustのコードを実行できる環境はかなり重宝しそうです。